home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Collection of Tools & Utilities
/
Collection of Tools and Utilities.iso
/
asmutil
/
asm_n_z.zip
/
VIDEO.ASM
< prev
next >
Wrap
Assembly Source File
|
1986-04-07
|
20KB
|
448 lines
;-------------------------------------------------------------------------------
;
; video.asm created 5-11-85
;
; VIDEO ROUTINES
; (C) COPYRIGHT 1985 BY THOMAS D. WEBB
;
; MODIFIED FOR MICROSOFT 'C' BY GREGORY ETCHELL 4-1-86
;
; ALL RIGHTS RESERVED.
; PERMISSION IS GRANTED FOR UNLIMITED PERSONAL, NON-COMMERCIAL USE ONLY.
;
;-------------------------------------------------------------------------------
TITLE VIDEO
_TEXT SEGMENT BYTE PUBLIC 'CODE'
_TEXT ENDS
CONST SEGMENT WORD PUBLIC 'CONST'
CONST ENDS
_BSS SEGMENT WORD PUBLIC 'BSS'
_BSS ENDS
_DATA SEGMENT WORD PUBLIC 'DATA'
_DATA ENDS
DGROUP GROUP CONST, _BSS, _DATA
ASSUME CS: _TEXT, DS: DGROUP, SS: DGROUP, ES:DGROUP
_BSS SEGMENT
BUFFER_SIZE EQU 2000D ;THE VIDEO BUFFER SIZE IN WORDS
NUM_BYTES_IN_ROW EQU 80 ;NUMBER OF BYTES IN A ROW
MONOCHROME_SEGADR EQU 0B000H ;ADDRESS OF MONOCHROME BUFFER
GRAPHICS_SEGADR EQU 0B800H ;ADDRESS OF GRAPHICS BUFFER
EVEN
_BSS ENDS
_TEXT SEGMENT
;-------------------------------------------------------------------------------
; CLEAR (ROUTINE 1)
; THIS ROUTINE CLEARS THE SCREEN
; THE C LANGUAGE CALL IS:
; CLEAR();
; THE ASSEMBLY CALL IS:
; CALL CLEAR
;-------------------------------------------------------------------------------
PUBLIC _clear
_clear PROC NEAR
PUSH BP ;THE FRAME POINTER
MOV AH,6 ;SCROLL ACTIVE PAGE UP
MOV AL,019H ;CLEAR 25 LINES
MOV CX,0H ;UPPER LEFT OF SCROLL
MOV DX,2479H ;LOWER RIGHT OF SCROLL
MOV BH,7H ;USE NORMAL ATTRIBUTE ON BLANKED LINE
INT 10H ;VIDEO-IO
POP BP ;THE FRAME POINTER
RET
_clear ENDP
;-------------------------------------------------------------------------------
; LOCATE (ROUTINE 2)
; THIS ROUTINE WILL LOCATE THE CURSOR AT A ROW AND COLUMN ON THE SCREEN
; THE C LANGUAGE CALL IS:
; LOCATE(ROW,COLUMN);è; THE ASSEMBLY CALL IS:
; MOV DX,COL ;RANGE IS 0 - 79
; PUSH DX
; MOV DX,ROW ;RANGE IS 0 - 24
; PUSH DX
; CALL LOCATE
;-------------------------------------------------------------------------------
PUBLIC _locate
_locate PROC NEAR ;PROC TO LOCATE THE CURSOR
PUSH BP ;THE FRAME POINTER
MOV BP,SP ;POINT TO MOST RECENT STACK ELE
MOV DH,[BP+4] ;GET THE ROW..
MOV DL,[BP+6] ;..AND THE COL
MOV BH,0H ;GRAPHICS PAGE NO.
MOV AH,2H ;SET_CURSOR_POSITION
INT 10H ;VIDEO-IO
POP BP ;THE FRAME POINTER
RET
_locate ENDP
;-------------------------------------------------------------------------------
; CURSIZE (ROUTINE 3)
; THIS ROUTINE SETS THE SIZE OF THE CURSOR
; THE C LANGUAGE CALL IS:
; CURSIZE(START_LINE,STOP_LINE);
; THE ASSEMBLY CALL IS:
; MOV DX,STOP_LINE ;13 IS NORMAL STOP_LINE FOR MONOCHROME ADAPTOR
; PUSH DX
; MOV DX,START_LINE ;12 IS NORMAL START_LINE FOR MONOCHROME ADAPTOR
; PUSH DX
; CALL CURSIZE
;-------------------------------------------------------------------------------
PUBLIC _cursize
_cursize PROC NEAR
PUSH BP ;THE FRAME POINTER
MOV BP,SP ;POINT TO MOST RECENT STACK ELE
MOV CH,[BP+4] ;CURSOR START LINE
MOV CL,[BP+6] ;CURSOR STOP LINE
MOV AH,1H ;SET CURSOR TYPE
INT 10H ;VIDEO-IO
POP BP ;THE FRAME POINTER
RET
_cursize ENDP
;-------------------------------------------------------------------------------
; GET_MODE (ROUTINE 4)
; THIS ROUTINE RETURNS THE CRT MODE IN AL, AND THE NUMBER OF CHARACTER
; COLUMNS ON THE SCREEN IN AH
; THE C LANGUAGE CALL IS: mode_area.value = get_mode();
; WHERE mode_area is defined as:
; union
; {
; int value;
; struct
; {è; char al; /*al EQ 7 is monochrome*/
; char ah; /*number of character columns on the screen*/
; } al_ah;
; } mode_area;
;
; THE ASSEMBLY CALL IS:
; CALL GET_MODE
;-------------------------------------------------------------------------------
PUBLIC _get_mode
_get_mode PROC NEAR
PUSH BP ;THE FRAME POINTER
MOV AX,0 ;CLEAR THE REG
MOV AH,15 ;GET CURRENT VIDEO MODE
INT 10H ;VIDEO-IO
POP BP ;THE FRAME POINTER
RET
_get_mode ENDP
;-------------------------------------------------------------------------------
; SET_VIDEO_ADDRESS (ROUTINE 5)
; THIS ROUTINE IS USED IN SEVERAL OF THE OTHER ROUTINES TO TEST THE VIDEO
; MODE AND TO SET THE CORRECT VIDEO BUFFER ADDRESS (MONOCHROME OR GRAPHICS).
; THE VIDEO BUFFER ADDRESS IS RETURNED IN AX.
; THIS IS AN INTERNAL ROUTINE SO THE C LANGUAGE AND ASSEMBLY LANGUAGE
; CALLS ARE NOT SHOWN IN THIS PROLOGUE.
;-------------------------------------------------------------------------------
SET_VIDEO_ADDRESS PROC NEAR
CALL _get_mode ;GET CRT MODE
CMP AL,7H ;IS IT A MONOCHROME CARD?
JNE ITS_GRAPHICS
MOV AX,MONOCHROME_SEGADR ;MONOCHROME BUFFER SEG ADDR
JMP RETURN
ITS_GRAPHICS: MOV AX,GRAPHICS_SEGADR ;GRAPHICS BUFFER SEG ADR
RETURN: RET
SET_VIDEO_ADDRESS ENDP
;-------------------------------------------------------------------------------
; CALC_VIDEO_OFFSET (ROUTINE 6)
; THIS ROUTINE IS USED BY SEVERAL OF THE ROUTINES TO CALCULATE THE OFFSET
; INTO THE VIDEO BUFFER FOR MOVING CHARACTERS INTO OR FROM THE VIDEO BUFFER.
; DX MUST BE SET TO THE ROW, AND CX MUST BE SET TO THE COLUMN BEFORE THIS
; ROUTINE IS EXECUTED. THE OFFSET IS RETURNED IN AX.
; THIS IS AN INTERNAL ROUTINE SO THE C LANGUAGE AND ASSEMBLY LANGUAGE
; CALLS ARE NOT SHOWN IN THIS PROLOGUE.
;-------------------------------------------------------------------------------
CALC_VIDEO_OFFSET PROC NEAR
MOV AX,NUM_BYTES_IN_ROW ;NUMBER OF BYTES IN ROW
MUL DX ;RESULT IS IN AX
ADD AX,CX ;THE COL
SHL AX,1 ;MULTIPLY BY 2 FOR CHAR/ATTR
RET
CALC_VIDEO_OFFSET ENDP
;-------------------------------------------------------------------------------
; ISRTSTR (ROUTINE 7)
; THIS ROUTINE POSITIONS ITSELF IN THE VIDEO BUFFER, THEN INSERTS A
; NULL-TERMINATED STRING, ALONG WITH AN ATTRIBUTE, DIRECTLY INTO THE VIDEO
; BUFFER
; THE C LANGUAGE CALL IS: ISRTSTR(ROW,COL,STRING,ATTR);
; THE ASSEMBLY CALL IS:
; MOV DX,ATTRIBUTE ;THE ATTRIBUTE BYTE (VALUE OF NORMAL IS 7)
; PUSH DX
; LEA DX,STRING ;GET ADDRESS OF THE STRING
; PUSH